/**
 * XDevice Raft 集群成员管理扩展
 * 
 * 支持功能：
 * 1. 动态添加/删除集群成员
 * 2. 热备节点管理
 * 3. 故障自愈机制
 * 4. 联合一致性配置变更
 */

#ifndef XDEVICE_RAFT_MEMBERSHIP_H
#define XDEVICE_RAFT_MEMBERSHIP_H

#include <xdevice/raft.h>
#include <stdint.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

/* 最大集群成员数 */
#define RAFT_MAX_CLUSTER_MEMBERS 16
#define RAFT_MAX_STANDBY_NODES 8

/* 成员状态 */
typedef enum {
    RAFT_MEMBER_ACTIVE = 1,      // 活跃成员
    RAFT_MEMBER_JOINING = 2,     // 正在加入
    RAFT_MEMBER_LEAVING = 3,     // 正在离开
    RAFT_MEMBER_STANDBY = 4,     // 热备状态
    RAFT_MEMBER_FAILED = 5,      // 故障状态
    RAFT_MEMBER_RECOVERING = 6   // 恢复中
} raft_member_status_t;

/* 集群成员信息 */
typedef struct {
    int node_id;
    char address[256];
    uint16_t port;
    raft_member_status_t status;
    uint64_t join_term;              // 加入时的任期
    uint64_t last_heartbeat_time;    // 最后心跳时间
    uint64_t failure_count;          // 故障计数
    bool is_voting_member;           // 是否有投票权
    double health_score;             // 健康评分 0-1
} raft_member_info_t;

/* 配置变更类型 */
typedef enum {
    RAFT_CONFIG_ADD_MEMBER = 1,
    RAFT_CONFIG_REMOVE_MEMBER = 2,
    RAFT_CONFIG_REPLACE_MEMBER = 3,
    RAFT_CONFIG_PROMOTE_STANDBY = 4,
    RAFT_CONFIG_DEMOTE_TO_STANDBY = 5,
    RAFT_CONFIG_MEMBER_STATUS_CHANGE = 6
} raft_config_change_type_t;

/* 配置变更请求 */
typedef struct {
    raft_config_change_type_t type;
    raft_member_info_t member_info;
    int target_node_id;              // 用于替换/降级操作
    bool force_change;               // 强制变更（紧急情况）
    char reason[256];                // 变更原因
} raft_config_change_request_t;

/* 集群配置 */
typedef struct {
    raft_member_info_t active_members[RAFT_MAX_CLUSTER_MEMBERS];
    raft_member_info_t standby_nodes[RAFT_MAX_STANDBY_NODES];
    int active_count;
    int standby_count;
    uint64_t config_version;         // 配置版本号
    bool in_joint_consensus;         // 是否处于联合一致性状态
    uint64_t change_start_term;      // 配置变更开始的任期
} raft_cluster_config_t;

/* 成员管理API */

/* 初始化成员管理 */
int raft_membership_init(void);
void raft_membership_cleanup(void);

/* 获取当前集群配置 */
int raft_get_cluster_config(raft_cluster_config_t* config);

/* 成员添加/删除 */
int raft_add_member(const raft_member_info_t* member_info);
int raft_remove_member(int node_id, const char* reason);
int raft_replace_member(int old_node_id, const raft_member_info_t* new_member);

/* 热备节点管理 */
int raft_add_standby_node(const raft_member_info_t* standby_info);
int raft_remove_standby_node(int node_id);
int raft_promote_standby_to_active(int standby_node_id);
int raft_demote_active_to_standby(int active_node_id);

/* 故障处理和自愈 */
int raft_handle_member_failure(int node_id);
int raft_attempt_member_recovery(int node_id);
int raft_trigger_auto_healing(void);

/* 配置变更管理 */
int raft_begin_config_change(const raft_config_change_request_t* request);
int raft_commit_config_change(uint64_t change_id);
int raft_abort_config_change(uint64_t change_id);

/* 健康监控 */
int raft_update_member_health(int node_id, double health_score);
int raft_get_cluster_health_status(void);
int raft_get_member_status(int node_id, raft_member_info_t* member_info);

/* 联合一致性支持 */
bool raft_is_in_joint_consensus(void);
int raft_get_quorum_size(void);
bool raft_has_majority_votes(int vote_count);

/* 自动故障转移配置 */
typedef struct {
    bool enable_auto_healing;        // 启用自动修复
    uint32_t failure_threshold;      // 故障阈值
    uint32_t recovery_timeout_ms;    // 恢复超时
    uint32_t health_check_interval;  // 健康检查间隔
    bool enable_standby_promotion;   // 启用热备提升
    double min_health_score;         // 最低健康评分
} raft_auto_healing_config_t;

int raft_configure_auto_healing(const raft_auto_healing_config_t* config);

/* 事件回调 */
typedef void (*raft_member_change_callback_t)(
    raft_config_change_type_t type,
    const raft_member_info_t* member,
    const char* reason
);

int raft_register_member_change_callback(raft_member_change_callback_t callback);

#ifdef __cplusplus
}
#endif

#endif /* XDEVICE_RAFT_MEMBERSHIP_H */
